// any  任何类型 （不做任何的类型校验，他可以接收任何类型的参数，也可以赋值给任何类型）

let a: any = 123;
a={}
a="123"
a=[]
a=()=>{}
a=true
a=null
a=undefined

// 同样的一个any类型的变量 可以赋值给任意类型的变量
let b:string = a
let c:number = a

const obj:any = {
    name:"why",
    age:18
}
obj.xxx='xxx'
obj.name();


// unknown  未知类型 

let abc: unknown = 123;
abc = '123'
abc = {}
abc = []
abc = true
abc = null
abc = undefined
abc = Symbol()
// unknown类型的变量 不能直接赋值给其他类型的变量
// let def: string = abc; // 报错


// void  空类型 一般代表函数没有返回值
function foo():void{
    console.log('foo')
}


// never(从不)  没有类型 
function handle(type: string | number | boolean) {
    if (typeof type === "string") {
      console.log(type.length);
    } else if (typeof type === "number") {
      console.log(type.toFixed(2));
    } else if(typeof type === "boolean"){
        console.log(type);
    } else {
        console.log(type);
      const check: never = type; // 这里的type只能是never类型
    }
}


// 元组 一般用来存储固定个数的不同类型的数据
let tuple: [string, number, boolean] = ["why", 18, true];
let str = tuple[0];

function useState<T>(initValue:T): [T, (newValue:T)=>void]{
  let state = initValue;
  function setState(newValue:T){
    state = newValue;
    // 触发视图更新
  }
  return [state,setState]
}
const [count,setCount] = useState<number>(0);

setCount(12)

const [arr,setArr]=useState<string[]>(['a','b','c'])
setArr(['a','b'])
// setArr([1,2]) // 报错


// 场景 ： 处理订单状态 ： 待付款（0）、待发货（1）、待收货（2）、待评价（3）

// 使用一些常量来提高代码的可读性
// const OrderState = {
//   WAIT_PAY: 0,
//   WAIT_DELIVER: 1,
//   WAIT_RECEIVE: 2,
//   WAIT_EVALUATE: 3,
// };
// function handleOrderStatus(status: number) {
//   switch (status) {
//     case OrderState.WAIT_PAY:
//       console.log("后续逻辑处理代码...");
//       break;
//     case OrderState.WAIT_DELIVER:
//       console.log("后续逻辑处理代码...");
//       break;
//     case OrderState.WAIT_RECEIVE:
//       console.log("后续逻辑处理代码...");
//       break;
//     case OrderState.WAIT_EVALUATE:
//       console.log("后续逻辑处理代码...");
//   }
// }

// handleOrderStatus(xxx)


enum OrderState {
  WAIT_PAY = 0,
  WAIT_DELIVER = 1,
  WAIT_RECEIVE = 2,
  WAIT_EVALUATE = 3,
}
function handleOrderStatus(status: OrderState) {
  switch (status) {
    case OrderState.WAIT_PAY:
      console.log("后续逻辑处理代码...");
      break;
    case OrderState.WAIT_DELIVER:
      console.log("后续逻辑处理代码...");
      break;
    case OrderState.WAIT_RECEIVE:
      console.log("后续逻辑处理代码...");
      break;
    case OrderState.WAIT_EVALUATE:
      console.log("后续逻辑处理代码...");
  }
}

handleOrderStatus(OrderState.WAIT_PAY);


enum Method {
  GET = "get",
  POST = "post",
  PUT = "put",
  DELETE = "delete",
}

console.log('value:',Method.GET); // "get"
console.log('index:',Method['get']); // GET 

enum Method2 {
  GET,
  POST,
  PUT,
  DELETE,
}
console.log('value:',Method2.GET); // 0
console.log('value:',Method2.POST); // 1
console.log('value:',Method2.PUT); // 2
console.log('value:',Method2.DELETE); // 3




// 常量类型

function sendRequest(type: "get" | "post" | "put" | "delete") {
  console.log(type);

}

sendRequest("get");
sendRequest("post");
// sendRequest("xxxx") // 报错



const type = "get"



type UserType = {
  name: string;
  age: number;
}


function handleUserState(user: UserType & { state: string }) {
  console.log(user.name);
  console.log(user.age);
  console.log(user.state);

}


let obj1:{} ={}
obj1=123
obj1="123"
obj1=true
// obj1=null // 报错
// obj1=undefined // 报错

export {}












